from sqlalchemy import create_engine,MetaData
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import sessionmaker


engine = create_engine("mysql+pymysql://root:9999@localhost:3306/zxzl?charset=utf8", \
                       pool_size=10, max_overflow=3, echo_pool=True)
metadata = MetaData()
metadata.reflect(engine,only=['user_link_role'])
Base = automap_base(metadata=metadata)   # 表单自动映射
session = sessionmaker(bind=engine) # 订制会话
Base.prepare()

'''
此为user_link_role表单的插入函数，首次注册插入可以不填公司名称company_name，但凡涉及到有关公司权限的都要求说明公司名称
user_id : 用户id
role_id : 角色id
company_name : 公司名称
插入成功返回 True 错误返回False
'''
def insert(user_id=None,role_id=None,company_name=None):
        Ulr = Base.classes.user_link_role
        sess = session()
        if user_id and role_id:
                new_ulr = Ulr(user_id=user_id,role_id=role_id)
        if user_id and role_id and company_name:
                new_ulr = Ulr(user_id=user_id,role_id=role_id,company_name=company_name)
        try:
                sess.add(new_ulr)
                sess.commit()
                sess.close()
                return True
        except:
                return False

'''
此为user_link_role查询函数，初步设定只能通过1.用户id，2.公司名和角色id，3.都搜索，4.只搜索公司名
user_id : 用户id
role_id : 角色id
company_name : 公司名称
成功返回一个二元数组，可以直接调用，否则返回False
'''
def select(user_id=None,role_id=None,company_name=None):
        Ulr = Base.classes.user_link_role
        sess = session()
        if user_id:
                ulr = sess.query(Ulr.user_id,Ulr.role_id,Ulr.company_name).filter_by(user_id=user_id).all()
        if company_name and role_id:
                ulr = sess.query(Ulr.user_id,Ulr.user_id,Ulr.company_name).filter_by(company_name=company_name,user_id=user_id).all()
        if user_id and role_id and company_name:
                ulr = sess.query(Ulr.user_id,Ulr.user_id,Ulr.company_name).filter_by(company_name=company_name,user_id=user_id,role_id=role_id).all()
        if company_name:
                ulr = sess.query(Ulr.user_id,Ulr.user_id,Ulr.company_name).filter_by(company_name=company_name).all()
        try:
                sess.commit()
                sess.close()
                return ulr
        except:
                return False

'''
此为user_link_role表单修改函数,要求用户的id必须输入，这是唯一标识，因为存在某权限多人，某公司多权限等情况
user_id : 用户id
role_id : 角色id
company_name : 公司名称
new_role_id : 新的角色id
new_company_name : 新的公司名称
修改成功返回True  错误返回False
'''
def update(user_id=None,role_id=None,company_name=None,new_role_id=None,new_company_name=None):
        Ulr = Base.classes.user_link_role
        sess = session()
        if user_id:
                if company_name and new_company_name:
                        ulr = sess.query(Ulr).filter_by(user_id=user_id,company_name=company_name).all()
                        ulr.company_name = new_company_name
                if role_id and company_name:
                        if new_role_id:
                                ulr = sess.query(Ulr).filter_by(user_id=user_id,company_name=company_name,role_id=role_id).all()
                                ulr.role_id= new_role_id
                        if new_company_name:
                                ulr = sess.query(Ulr).filter_by(user_id=user_id,company_name=company_name,role_id=role_id).all()
                                ulr.company_name = new_company_name
                        else:
                                return False      # 执行了if语句就往下走，否则直接回返
                try:
                        sess.commit()
                        sess.close()
                        return True
                except:
                        sess.rollback()
                        return False
        else:
                return False

'''
此为user_link_role的删除函数，其中要求1.输入全部参数，2.输入部分参数如公司名
user_id : 用户id
role_id : 角色id
company_name : 公司名称
成功返回 True 失败返回False
'''
def delete(user_id=None,role_id=None,company_name=None):
        Ulr = Base.classes.user_link_role
        sess = session()
        if user_id and role_id and company_name:    # 输入全部参数方式
                ulr = sess.query(Ulr).filter_by(user_id=user_id,role_id=role_id,company_name=company_name).all()

        if company_name:           # 输入公司名方式
                ulr = sess.query(Ulr).filter_by(company_name=company_name).all()
        else:
                return False
        if ulr is None:
                return False
        try:
                for i in ulr:
                        sess.delete(i)
                sess.commit()
                sess.close()
                return True
        except:
                sess.rollback()
                return False

